import dayjs from 'dayjs';

/**
 * 格式化日期
 * @param date 日期
 * @param format 格式
 * @returns 格式化后的日期字符串
 */
export function formatDate(date: Date | string | number | null | undefined, format = 'YYYY-MM-DD'): string {
  if (date === null || date === undefined || date === '') {
    return '';
  }

  try {
    return dayjs(date).format(format);
  } catch (error) {
    console.error('Error formatting date:', error);
    return '';
  }
}

/**
 * 获取当前日期
 * @param format 格式
 * @returns 当前日期字符串
 */
export function getCurrentDate(format = 'YYYY-MM-DD'): string {
  return formatDate(new Date(), format);
}

/**
 * 日期时间格式化
 * @param date 日期
 * @param format 格式
 * @returns 格式化后的日期时间字符串
 */
export function formatDateTime(date: Date | string | number | null | undefined, format = 'YYYY-MM-DD HH:mm:ss'): string {
  if (date === null || date === undefined || date === '') {
    return '';
  }

  try {
    return formatDate(date, format);
  } catch (error) {
    console.error('Error formatting datetime:', error);
    return '';
  }
}

/**
 * 获取当前日期时间
 * @param format 格式
 * @returns 当前日期时间字符串
 */
export function getCurrentDateTime(format = 'YYYY-MM-DD HH:mm:ss'): string {
  return formatDateTime(new Date(), format);
}

/**
 * 比较两个日期是否相等
 * @param date1 日期1
 * @param date2 日期2
 * @param format 比较格式
 * @returns 是否相等
 */
export function compareDate(date1: Date | string | number, date2: Date | string | number, format = 'YYYY-MM-DD'): boolean {
  try {
    return dayjs(date1).format(format) === dayjs(date2).format(format);
  } catch (error) {
    console.error('Error comparing dates:', error);
    return false;
  }
}

/**
 * 计算两个日期相差的天数
 * @param date1 日期1
 * @param date2 日期2
 * @returns 天数
 */
export function diffDays(date1: Date | string | number, date2: Date | string | number): number {
  try {
    return dayjs(date1).diff(dayjs(date2), 'day');
  } catch (error) {
    console.error('Error calculating date difference:', error);
    return 0;
  }
}

export default {
  formatDate,
  getCurrentDate,
  formatDateTime,
  getCurrentDateTime,
  compareDate,
  diffDays,
};
